# -*- coding: utf-8 -*-
"""
Module Description: 接口开关拦截器

:last modified: 添加区服限制
:last modified date: 2020-09-02 09:47:07 (+0800)
"""
from app.const.lang.tips_info import TipsInfo
from framework.firefly_dc.global_errcode import GlobalErrCode
from framework.firefly_dc.globalobject import GlobalObject
from framework.interceptor.base_interceptor import BaseInterceptor


class ActionSwitchInterceptor(BaseInterceptor):
    """接口开关拦截器"""
    # 单接口/区服 区间长度
    S_LENGTH = 1
    # 多接口/区服 区间长度
    M_LENGTH = 2

    @staticmethod
    def pre_process(request, response):
        """
        控制模块（接口）的开关
        Zk相应的字段配置规则如下：
        "module_switch":{
            模块名：{
                "server_id": 区服id模型
                接口id模型: 提示文本
            }
        }

        示例如下：
        "module_switch":{
            "chat":{
                 "server_id": "1, 4, 7"
                "action_id1, action_id2, action_id3": "Text1",
            },
            "alliance":{
                "server_id": "7-19"
                "action_id(start)-action_id(end)": "Text2"
            },
            "mail": {
                "server_id": "1, 4, 7-19"
                "action_id1, action_id2, action_id(start)-action_id(end)": "Text3",
            }
            ......
        }
        注：
        接口之间以逗号隔开，接口可以单个接口（eg：15100），也可以传接口范围（eg：15101-15110）;
        若没有自定义文本，则提示默认文本（该服务暂时不可用）;
        【server_id】为固定的key值，若没有传，则默认表示所有的区服
        """
        try:
            # 获取zk上的开关列表
            action_switch = GlobalObject.global_config["action_switch"]
        except:
            return True
        for forbid in action_switch:
            server_id_dict = forbid.get("server_id", {})
            if server_id_dict:
                if str(request.ctx.server_id) in server_id_dict:
                    if str(request.action_id) in forbid.get("action_id", {}):
                        response.set_info(info=forbid.get("tips", TipsInfo.GlobalKeys.actionUnavailable),
                                          stat=GlobalErrCode.ERROR)
                        return False
            else:
                if str(request.action_id) in forbid.get("action_id", {}):
                    response.set_info(info=forbid.get("tips", TipsInfo.GlobalKeys.actionUnavailable),
                                      stat=GlobalErrCode.ERROR)
                    return False
        return True
